之前的文章有提過一句話「在Ruby裡,幾乎所有的東西都是物件」,這是否也代表每一行我們所打的code是否都屬於物件呢?
self
在Ruby是一個非常特別的存在,且永遠指向目前正在執行的物件,換句話說,就是self
會根據現在放在哪個context(class、method..)的不同,指的當下就是物件自己。
這樣描述還是很模糊的感覺,下面會用幾個例子去理解self
放在不同context的時候,會長什麼樣子。
name = "Louis"
puts "Name is: #{name}"
puts "Self is: #{self}"
puts "Self class is: #{self.class}"
# =>
# Name is: Louis
# Self is: main
# Self class is: Object
這裡可以看到self
是個main物件,且main物件是類別Object下的實體,如果用程式碼寫:
class Object
def reflect
end
end
main = Object.new #main大概是這種感覺
class Louis
def say
puts self
end
def self.say
puts self
end
end
#實體方法
kk = Louis.new
kk.say # => 此時的self為Louis class所產生的實體 <Louis:0x00007fad048259e8>
#類別方法
Louis.say # => 此時的self為Louis class本身
class Louis
puts "Self is: #{self}"
end
# => Self is: Louis
此時的self為Louis class本身 => Louis
module Group
puts "Self inside Group is: #{self}"
end
# => Self inside Group is: Group
此時的self為module Group本身 => Group
module Group
puts "Self inside Group is: #{self}"
# => Self inside Group is: Group
class Louis
puts "Self inside Group is: #{self}"
# => Self inside Group is: Group::Louis
end
end
這裡的class是包在module裡面,所以這裡的self是Group::Louis
class Lion
def say
puts self
end
end
class Pig < Lion
end
ponpon = Pig.new
ponpon.say # => #<Pig:0x00007fcb8801ca38>
此時的self為Pig class所產生的實體
module Pig
def say
puts self
end
end
class Lion
include Pig
end
mufasa = Lion.new
mufasa.say # => #<Lion:0x00007fa502824390>
此時的self為Lion class所產生的實體
參考資料:
Self in Ruby:A Comprehensive Overview
Understanding self
in Ruby
@/@@ vs. self in Ruby
Ruby’s Main Object (Top Level Context)
Rubyのselfが微妙に意味がわからなかったので、様々な文脈(トップレベル、class定義内、method定義内、module定義内)で出力してみた
Ruby 中的self變數以及應用
“Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.”
— Thomas Edison, Inventor
本文同步發佈於: https://louiswuyj.tw/